package com.example.administrator.exkotlin.base

import android.util.Log
import java.lang.StringBuilder

/**
 * Author by lp,on 2020/11/20/020,10:37.
 *
 * DSL 领域特定语言
 * 用来赋予编程者构建专有的语法结构 infix语法 高阶函数等方式实现
 */

/**
 * 构建一个html列表生成工具
 * */

/*表*/
class Table{
    private val children=ArrayList<Tr>()
    fun tr(block: Tr.() -> Unit){
        val tr=Tr()
        tr.block()
        children.add(tr)
    }
    fun toHtml():String{
        val builder=StringBuilder()
        //开头
        builder.append("<table>")
        //添加单元格
        for (child in children) {
            builder.append(child.toHtml())
        }
        //结尾
        builder.append("\n</table>")
        return builder.toString()
    }

}

/*行*/
class Tr{
   private val children=ArrayList<Td>()
    /*添加单元格*/
    fun td(block:Td.() ->String){
        val td=Td()
        td.content=td.block()
        children.add(td)
    }
    fun toHtml():String{
        val builder=StringBuilder()
        //开头
        builder.append("\n\t<tr>")
        //添加单元格
        for (child in children) {
            builder.append(child.toHtml())
        }
        //结尾
        builder.append("\n\t</tr>")
        return builder.toString()
    }
}

/*单元格*/
class Td {
    var content=""
    fun toHtml()="\n\t\t<td>$content</td>"

}


/** 我是main入口函数 **/
fun main(args: Array<String>) {
    val table=Table()
    //第一行
    table.tr {
        td { "测试1" }
        td { "测试2" }
        td { "测试3" }
    }
    table.tr {
        td { "测试4" }
        td { "测试5" }
        td { "测试6" }
    }
    println(table.toHtml())
}
